<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            Object.defineProperty()

                a. 定义对象的属性，能够让对象的属性拥有更高级的配置
                b. 使用getter和setter的时候，一定不要写 value 和 writable 属性
                c. 定义属性返回和修改的代理属性，一般都是同名的，但是会加上_
                d. 将来的vue还会把这个东西再次拿出来分析
        */

        // 1. Object.defineProperty()
        // 做对象属性的代理

        // let _a = 0;
        Object.defineProperty(window, 'a', {
            // enumerable: true,
            // configurable: true,
            get() {
                this._a = this._a || 0;
                this._a++;
                return this._a;
            },
            set(n) {
                this._a = n;
            }
        })

        // a 只要出现一次，就会执行一次getter
        if (a === 1 && a === 2 && a === 3) {
            console.log('ok!');
        }

        // console.log(window);

    </script>
</body>

</html>